package com.powernode.ssm.task;

import com.powernode.ssm.dao.UserLoginAttemptMapper;
import com.powernode.ssm.dao.UserLoginTokenMapper;
import com.powernode.ssm.utils.DateTimeUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 定时清理 user_login_token 表中过期的 token 记录
 * 例如：每天凌晨 2 点执行一次，删除 expire_time < 当前时间的 token
 */
@Slf4j
@Component
public class TokenCleanupTask {

    @Autowired
    private UserLoginTokenMapper userLoginTokenMapper;

    @Autowired
    private UserLoginAttemptMapper userLoginAttemptMapper;

    /**
     * ✅ 定时任务：每天凌晨 2:00 执行一次
     *      可根据需要调整 cron 表达式，比如每小时、每天等
     *      示例：每天 2AM => "0 0 2 * * ?"
    */
//    每小时执行一次："0 0 * * * ?"
//    每 30 分钟执行一次："0 */30 * * * ?"
//    每天中午 12 点："0 0 12 * * ?"
    @Scheduled(cron = "0 0 2 * * ?") // 每天 2:00 AM 执行
    public void cleanupExpiredTokens() {
        try {
            log.info("[定时任务] 开始清理过期的 token 记录...");
            int deletedCount = userLoginTokenMapper.deleteExpiredTokens();
            log.info("[定时任务] 清理完成，共删除过期 token 记录 {} 条", deletedCount);
        } catch (Exception e) {
            log.error("[定时任务] 清理过期 token 记录时发生异常", e);
        }
    }

    /**
     * ✅ 定时任务：每天凌晨 2:00 执行一次
     * 可根据需要调整 cron 表达式
     */
    @Scheduled(cron = "0 0 2 * * ?") // 每天 02:00 AM 执行
    public void cleanupOldLoginAttempts() {
        String today = DateTimeUtils.dateString();
        log.info("[定时任务] 开始清理 user_login_attempt 表中小于当前日期 {} 的旧记录...",today);

        try {
            int deletedCount = userLoginAttemptMapper.deleteByCreatedAtBefore();
            log.info("[定时任务] ✅ 清理完成，共删除 {} 条 user_login_attempt 记录（早于 {}）", deletedCount, today);
        } catch (Exception e) {
            log.error("[定时任务] ❌ 清理 user_login_attempt 表时发生异常：", e);
        }
    }
}